home *** CD-ROM | disk | FTP | other *** search
/ Scene 96 / Scene 96 International Edition (Zyklop Software) (Disc 2) (1997).iso / misc / coding / voxelsp2 / r5.cpp < prev    next >
C/C++ Source or Header  |  1996-05-01  |  11KB  |  508 lines

  1. // VoxelScape using ray-casting
  2. // Rex Deathstar, June 1995
  3. // email  : deathstr@singnet.com.sg
  4. // BBS HQ : Developer's Site BBS (065-561-0237)
  5. // IRC    : #coders (nick : DeathScar)
  6.  
  7. // Snowman : get well soon!
  8.  
  9. // Yes, source codes source codes! Dun u love it?
  10. // Sorry this program was never finished, but the idea is there anyway.
  11. // If you wanna code this on a Pentium, dun use the unrolled loops like
  12. // I did in this source, it's a bad idea ;)
  13. // I hope you put in the effort to at least understand what the code does
  14. // before you use for it for any form, this would be a nice form of
  15. // appreciation. Also, a greet in your demo would be nice too.
  16.  
  17. // To all international demo freaks,
  18. // the following are the local demo groups in Singapore :
  19. // .Mode XiX
  20. // .MysTiCal
  21. // .PowerSurge
  22. // .Constellation
  23. // .ArchAngels
  24. // .BlackMagic
  25. // .SDF (Salient Demo Force)
  26. // .WaterLogic
  27. //
  28. // Yes, there's a demo scene as far out as in Asia, in Singapore! :)
  29. //
  30. // Come and attend our second demo party in Singapore, called 'The Scene 96'!
  31. // U can get the info file from Developer's Site BBS (065-561-0237)
  32. //
  33. //                      WaterLogic productions
  34. //===========================================================================
  35. //............................Year 1994......................................
  36. //1.  REXINTRO.ZIP....debut selftro
  37.  
  38. //2.  ASYLUM!.ZIP ....Advert for Asylum BBS (closed down now :( )
  39.  
  40. //3.  ICHIBAN!.ZIP....Advert for IchiBan BBS
  41.  
  42. //4.  ANARCHY!.ZIP....Advert for Anarchy Online BBS
  43.  
  44. //5.  ICHIBAN2.ZIP....2nd Advert for IchiBan BBS
  45.  
  46. //6.  COROM.ZIP   ....Advert for COROM PRODUCTIONS BBS
  47.  
  48. //...........................Year 1995.......................................
  49. //7.  _FACES.ZIP  ....Slideshow demo featuring realtime crossfading
  50.  
  51. //8.  TINIFIRE.ZIP....76 byte fire routine, real small huh? (Full sources)
  52.  
  53. //9.  TINYSTAR.ZIP....123 byte 3D starfield, another small one. (Full sources)
  54.  
  55. //10. DELAYDOT.ZIP....3D object morph with delaydots. (Full sources)
  56.  
  57. //11. PARTICLE.ZIP....3D Lissajous figures morph. (Full sources)
  58.  
  59. //12. PURENESS.ZIP....1st place megademo during 'The Scene 95' demo party at
  60. //                    Seaview Hotel/Singapore on 2nd July 1995.
  61.  
  62. //13. COROMSRC.ZIP....Source codes to a BBS advert
  63.  
  64. //14. WATERFAL.ZIP....Source codes to a waterfall effect as seen in REXINTRO.
  65.  
  66. //............................Year 1996......................................
  67. //15. PLASWARP.ZIP....Source codes to the plasma and image warp effect as
  68. //                    seen in Pureness (needs PURENESS.DAT to run)
  69.  
  70. //16. DEVSITE!.ZIP....BBS advert for Developer's Site BBS, now WaterLogic's
  71. //                    HQ. Features SVGA 3D motion blur.
  72.  
  73. //16. AGEN-ART.ZIP....High-res JPGs of Agen's art seen in Pureness
  74.  
  75. //17. STARGATE.ZIP....Source codes to the texture-mapped wormhole seen
  76. //                    in Pureness.
  77.  
  78. //18. MODELIST.ZIP....Generic VESA graphic mode lister with sources in C
  79.  
  80. //19. VOXELSPC.ZIP....Source codes to a fast height&color interpolated
  81. //                    Voxel landscape routine
  82.  
  83. //20. MPHONG.ZIP......Full sources to transparent motion-blur phong effect
  84.  
  85. //21. VOXELSP2.ZIP....Full sources to another method of voxel landscape using
  86. //                    raycasting
  87.  
  88. //22. D???????.ZIP....Megademo for 'The Scene 96' using the demo system EXP24
  89. //                    Will be released on 2nd June 1996.
  90.  
  91.  
  92. #pragma inline
  93. asm .486
  94.  
  95. #include <math.h>
  96. #include <dos.h>
  97. #include <process.h>
  98. #include <conio.h>
  99. #include <stdio.h>
  100. #include "fader.h"
  101.  
  102.  
  103. float    USER_DISTANCE=    80.0;
  104. float   USER_HEIGHT  =     100.0;
  105. float   SKY_HEIGHT   =    2000.0;
  106.  
  107. #define rad 0.01745329
  108. #define VIEWPORT_LEFT    -100
  109. #define VIEWPORT_RITE    100
  110. #define VIEWPORT_TOP    -100
  111. #define VIEWPORT_BOT    100
  112. #define VIEWPORT_CENTER 0
  113. #define SCREEN_WIDTH     320
  114. #define SCREEN_HEIGHT    200
  115.  
  116.  
  117. unsigned int    sky,ground,colormap,vbuffer,vram=0xa000;
  118.     char    pal[256][3];
  119.     float    user_angle,ray_angle_left,ray_angle_rite,ray_length;
  120.     long    tex_x,tex_y,tex_xadd,tex_yadd;
  121.     long    tex_xstart,tex_xend,tex_ystart,tex_yend;
  122.     long    user_x,user_y,nframes;
  123.     int    ray_x,ray_y,a,key,scanline;
  124.     int    udistance=USER_DISTANCE,distance,nap;
  125. unsigned long    y_offset[1000];
  126. unsigned int    hbuffer[320];
  127.  
  128.  
  129. asm sky_file db      'height.dat',0
  130. asm ground_file db   'height.dat',0
  131. asm colormap_file db 'color.dat',0
  132.  
  133. void graphics();
  134. void text();
  135. void load_texture();
  136. void floor_mapping();
  137. void sky_mapping();
  138. void pixel(int x,int y,char tx,char ty);
  139. void raycast_one_scanline();
  140. void voxel_one_scanline();
  141. void vretrace();
  142. void earth_napping();
  143.  
  144. void main()
  145. {
  146.     if(allocmem(4096,&sky)!=-1) exit(1);
  147.     if(allocmem(4096,&ground)!=-1) exit(1);
  148.     if(allocmem(4096,&colormap)!=-1) exit(1);
  149.     if(allocmem(4096,&vbuffer)!=-1) exit(1);
  150.     load_texture();
  151.  
  152.     graphics();
  153.  
  154.     while(!kbhit())
  155.     {
  156.     vretrace();
  157.     sky_mapping();
  158.     floor_mapping();
  159.     nframes++;
  160.     }
  161.  
  162.     getch();
  163.     text();
  164. }
  165. //--------------
  166. void floor_mapping()
  167. {
  168.  
  169. asm mov fs,[ground]
  170. asm mov gs,[colormap]
  171. asm mov es,[vram]
  172.  
  173. user_angle+=0.005;
  174. user_x+=200;
  175. user_y+=160;
  176.  
  177. //USER_HEIGHT=200.0*sin(nframes*rad)+200+50;
  178.  
  179. ray_angle_left=atan(VIEWPORT_LEFT/USER_DISTANCE);
  180. ray_angle_rite=atan(VIEWPORT_RITE/USER_DISTANCE);
  181.  
  182.     earth_napping();
  183.  
  184.     for(ray_y=20; ray_y<100; ray_y+=1)
  185.     {
  186.     ray_length=(float)USER_DISTANCE/(ray_y+1)*USER_HEIGHT;
  187.     distance=ray_length+800;
  188.  
  189.     tex_xstart=ray_length*sin(ray_angle_left+user_angle)*120;
  190.     tex_ystart=ray_length*cos(ray_angle_left+user_angle)*120;
  191.  
  192.     tex_xend=ray_length*sin(ray_angle_rite+user_angle)*120;
  193.     tex_yend=ray_length*cos(ray_angle_rite+user_angle)*120;
  194.  
  195.     tex_xadd=(tex_xend-tex_xstart)/160;
  196.     tex_yadd=(tex_yend-tex_ystart)/160;
  197.  
  198.     tex_x=tex_xstart+user_x;
  199.     tex_y=tex_ystart+user_y;
  200.  
  201.  
  202.     voxel_one_scanline();
  203.     }
  204.  
  205.  
  206.     asm push ds
  207.     asm pop es
  208.     asm lea di,[hbuffer]
  209.     asm mov cx,320
  210.     asm xor ax,ax
  211.     asm rep stosw
  212.  
  213. }
  214. //--------------
  215. void earth_napping()
  216. {
  217.     ray_y=100;
  218.  
  219.     ray_length=(float)USER_DISTANCE/(ray_y+1)*USER_HEIGHT;
  220.     distance=ray_length+500;
  221.  
  222.     tex_xstart=ray_length*sin(user_angle)*170;
  223.     tex_ystart=ray_length*cos(user_angle)*170;
  224.  
  225.     tex_x=tex_xstart+user_x;
  226.     tex_y=tex_ystart+user_y;
  227.  
  228.     asm mov bl,byte ptr [tex_x+1]
  229.     asm mov bh,byte ptr [tex_y+1]
  230.     asm movzx ax,byte ptr fs:[bx]
  231.     asm mov cx,80
  232.     asm mul cx
  233.     asm div [distance]
  234.     asm shr ax,2
  235.     asm mov [nap],ax
  236.  
  237. }
  238. //--------------
  239. void voxel_one_scanline()
  240. {
  241. asm mov di,[ray_y]
  242. asm     add di,100
  243. asm shl di,2
  244. asm mov edi,dword ptr y_offset[di]
  245. asm mov [scanline],di
  246.  
  247. asm mov eax,dword ptr [tex_xadd]
  248. asm mov ebp,dword ptr [tex_yadd]
  249. asm mov ecx,dword ptr [tex_x]
  250. asm mov edx,dword ptr [tex_y]
  251.  
  252. asm lea si,[hbuffer]
  253.  
  254. asm mov [a],160
  255. oloop:
  256. asm mov bl,ch
  257. asm mov bh,dh
  258. asm add cx,ax
  259. asm add dx,bp
  260.  
  261. asm pusha
  262. asm mov cl,gs:[bx] // get color
  263. asm mov ch,cl
  264.  
  265. asm movzx ax,byte ptr fs:[bx]    // get height
  266. asm mul [udistance]    // y'=user.dist*height/total.dist
  267. asm div [distance]
  268. //asm mov dx,[si]
  269. //asm sub dx,ax
  270. //asm mov [si],ax
  271. //asm jc  done
  272.  
  273. asm mov bp,ax
  274. asm shl bp,2
  275. asm mov eax,dword ptr y_offset[bp]
  276. asm sub edi,eax
  277. asm cmp edi,64000
  278. asm ja done
  279.  
  280. vstrip:
  281. asm mov es:[di],cx
  282. asm mov es:[di+320],cx
  283. //asm add di,320
  284. //asm cmp di,[scanline]
  285. //asm jbe vstrip
  286. //asm dec dx
  287. //asm jnz vstrip
  288.  
  289. done:
  290. asm popa
  291. asm add di,2
  292. asm add si,2
  293. asm dec [a]
  294. asm jnz oloop
  295. }
  296.  
  297.  
  298. //--------------
  299. void sky_mapping()
  300. {
  301.  
  302. asm mov fs,[sky]
  303.  
  304.     for(ray_y=VIEWPORT_TOP; ray_y<VIEWPORT_CENTER; ray_y++)
  305.     {
  306.     ray_length=(float)USER_DISTANCE/(ray_y-1)*(USER_HEIGHT-SKY_HEIGHT);
  307.  
  308.     tex_xstart=ray_length*sin(ray_angle_left+user_angle)*10;
  309.     tex_ystart=ray_length*cos(ray_angle_left+user_angle)*10;
  310.  
  311.     tex_xend=ray_length*sin(ray_angle_rite+user_angle)*10;
  312.     tex_yend=ray_length*cos(ray_angle_rite+user_angle)*10;
  313.  
  314.     tex_xadd=((tex_xend-tex_xstart)/SCREEN_WIDTH);
  315.     tex_yadd=((tex_yend-tex_ystart)/SCREEN_WIDTH);
  316.  
  317.     tex_x=tex_xstart+(user_x>>5);
  318.     tex_y=tex_ystart+(user_y>>5);
  319.  
  320.     raycast_one_scanline();
  321.     }
  322.  
  323.  
  324. }
  325. //--------------
  326. void raycast_one_scanline()
  327. {
  328. asm mov di,[ray_y]
  329. asm add di,100        //screen center
  330. asm shl di,2
  331. asm mov di,y_offset[di]    //start offset of current scanline
  332.  
  333. asm mov eax,dword ptr [tex_xadd]
  334. asm mov ebp,dword ptr [tex_yadd]
  335. asm mov ecx,dword ptr [tex_x]
  336. asm mov edx,dword ptr [tex_y]
  337.  
  338. asm push ds
  339. asm mov ds,[vram]
  340.  
  341. asm rept 320
  342. asm mov bl,ch
  343. asm mov bh,dh
  344. asm add cx,ax
  345. asm add dx,bp
  346. asm mov bl,fs:[bx]
  347. asm mov [di],bl
  348. asm inc di
  349. asm endm
  350.  
  351. asm pop ds
  352. }
  353. //--------------
  354. void graphics()
  355. {
  356.     FILE *f;
  357.  
  358.   //set mode 13h
  359. asm mov    ax,0x13
  360. asm int    0x10
  361.  
  362.     // change refresh from 70Hz to 60Hz
  363.     asm    cli
  364.     asm    mov    dx,0x3cc
  365.     asm    in    al,dx
  366.     asm    or    al,0xc0    //on bit 7,8 for 480 scan lines
  367.     asm    mov    dx,0x3c2
  368.     //asm    out    dx,al
  369.     asm    sti
  370.  
  371.  
  372. f=fopen("raycast.pal","rb");
  373. fread(pal,1,768,f);
  374. fclose(f);
  375.  
  376. VGADAC(&pal[0][0]);
  377.  
  378.  
  379. for(a=0; a<1000; a++)
  380. y_offset[a]=320L*a;
  381. }
  382.  
  383. //-----------------
  384. void text()
  385. {
  386. asm mov    ax,0x03
  387. asm int    0x10
  388. }
  389.  
  390.  
  391. //-----------------
  392. void load_texture()
  393. {
  394. //load sky texture
  395. asm mov ax,0x3d00
  396. asm lea dx,[sky_file]
  397. asm int 0x21
  398. asm mov bp,ax
  399.  
  400. asm mov bx,bp
  401. asm mov ax,0x3f00
  402. asm xor dx,dx
  403. asm mov cx,32768
  404. asm push ds
  405. asm mov ds,[sky]
  406. asm int 0x21
  407. asm pop ds
  408.  
  409. asm mov bx,bp
  410. asm mov ax,0x3f00
  411. asm mov dx,32768
  412. asm mov cx,32768
  413. asm push ds
  414. asm mov ds,[sky]
  415. asm int 0x21
  416. asm pop ds
  417.  
  418. asm mov bx,bp
  419. asm mov ax,0x3e00
  420. asm int 0x21
  421.  
  422. //load ground texture
  423. asm mov ax,0x3d00
  424. asm lea dx,[ground_file]
  425. asm int 0x21
  426. asm mov bp,ax
  427.  
  428. asm mov bx,bp
  429. asm mov ax,0x3f00
  430. asm xor dx,dx
  431. asm mov cx,32768
  432. asm push ds
  433. asm mov ds,[ground]
  434. asm int 0x21
  435. asm pop ds
  436.  
  437. asm mov bx,bp
  438. asm mov ax,0x3f00
  439. asm mov dx,32768
  440. asm mov cx,32768
  441. asm push ds
  442. asm mov ds,[ground]
  443. asm int 0x21
  444. asm pop ds
  445.  
  446. asm mov bx,bp
  447. asm mov ax,0x3e00
  448. asm int 0x21
  449.  
  450. //load color map for ground texture
  451. asm mov ax,0x3d00
  452. asm lea dx,[colormap_file]
  453. asm int 0x21
  454. asm mov bp,ax
  455.  
  456. asm mov bx,bp
  457. asm mov ax,0x3f00
  458. asm xor dx,dx
  459. asm mov cx,32768
  460. asm push ds
  461. asm mov ds,[colormap]
  462. asm int 0x21
  463. asm pop ds
  464.  
  465. asm mov bx,bp
  466. asm mov ax,0x3f00
  467. asm mov dx,32768
  468. asm mov cx,32768
  469. asm push ds
  470. asm mov ds,[colormap]
  471. asm int 0x21
  472. asm pop ds
  473.  
  474. asm mov bx,bp
  475. asm mov ax,0x3e00
  476. asm int 0x21
  477.  
  478.  
  479. // post process textures
  480. asm mov es,[sky]
  481. asm xor di,di
  482. p1:
  483. asm shr byte ptr es:[di],1
  484. asm add byte ptr es:[di],128
  485. asm inc di
  486. asm jnz p1
  487.  
  488. asm mov es,[colormap]
  489. asm xor di,di
  490. p2:
  491. asm shl byte ptr es:[di],1
  492. asm inc di
  493. asm jnz p2
  494. }
  495. //---------------
  496. void vretrace()
  497. {
  498. asm mov dx,0x3da
  499. vr1:
  500. asm in al,dx
  501. asm test al,8
  502. asm jnz vr1
  503. vr2:
  504. asm in al,dx
  505. asm test al,8
  506. asm jz vr2
  507. }
  508.